package com.xtck.ha.fault.framework.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author cuixidong
 * @version 1.0
 * @date 2023/4/26 15:29
 **/
@Component
@Slf4j
public class FileInfosUtils {

//    private static String onlyOffice = null;

    private static String fileUploadPath = null;

    private static String fileUploadRelative = null;

    @Value("${file.upload.path}")
    public void setFileUploadPath(String fileUploadPath){
        FileInfosUtils.fileUploadPath = fileUploadPath;
    }

    @Value("${file.upload.relative}")
    public void setFileUploadRelative(String fileUploadRelative){
        FileInfosUtils.fileUploadRelative = fileUploadRelative;
    }

//    @Value("${file.onlyOffice-server}")
//    public void setFileUploadOffice(String onlyOffice){
//        FileInfosUtils.onlyOffice = onlyOffice;
//    }

    /**
     * 上传文件
     *
     * @param file
     * @return
     */
    public static String uploadFile(MultipartFile file) {
        String fileName = "";

        try {
            fileName = file.getOriginalFilename();

            String url = fileUploadPath + "/" + fileName;
            //构建文件对象
            File dest = new File(url);
            //判断文件父目录是否存在
            if (!dest.getParentFile().exists()) {
                //不存在就创建一个
                dest.getParentFile().mkdirs();
                log.info("创建文件父目录");
            }
            //将文件保存到本地
            file.transferTo(dest);
            log.info("文件保存成功,地址:{}", url);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
//        String resultUrl = onlyOffice + FileInfosUtils.fileUploadRelative + "/" + fileName;
        String resultUrl = FileInfosUtils.fileUploadRelative + "/" + fileName;
        return resultUrl;
    }

    /**
     * 上传压缩包并解压
     *
     * @param file
     * @return
     */
    public static String uploadZip(MultipartFile file) {
        String fileName = "";

        try {
            fileName = file.getOriginalFilename();

            String url = fileUploadPath + "/" + fileName;
            //构建文件对象
            File dest = new File(url);
            //判断文件父目录是否存在
            if (!dest.getParentFile().exists()) {
                //不存在就创建一个
                dest.getParentFile().mkdirs();
                log.info("创建文件父目录");
            }
            //将文件保存到本地
            file.transferTo(dest);
            log.info("文件保存成功,地址:{}", url);

            /**将压缩包解压*/
            unzip(url);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
//        String resultUrl = onlyOffice + FileInfosUtils.fileUploadRelative + "/" + fileName;
        String resultUrl = FileInfosUtils.fileUploadRelative + "/" + fileName.substring(0,fileName.lastIndexOf("."));
        return resultUrl;
    }

    // 解压zip格式
    public static void unzip(String path){
        // 根据原始路径（字符串），创建源文件（File对象）
        log.info("开始解压文件"+path);
        File sourceFile = new File(path);

        // 根目录
        String sourceFileName = sourceFile.getName();
        File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));

        // 判断根目录是否已经存在
        if(rootDir.exists()){
            // 如果存在，则删除
            // rootDir.delete(); // 仅能删除空目录

            // 使用commons-io包提供的FileUtils工具类进行删除
            try {
                FileUtils.deleteDirectory(rootDir);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 创建根目录
        rootDir.mkdirs();
        // System.out.println(rootDir);


        // ZipInputStream:用于进行zip格式的压缩文件输入流
        try (ZipInputStream in  = new ZipInputStream(new FileInputStream(sourceFile))) {
            // 遍历压缩包中的每个子目录或子文件（ZipEntry类型的对象）
            ZipEntry zipEntry = null;
            while((zipEntry = in.getNextEntry()) != null){
                // System.out.println(zipEntry.getName());

                // 创建子目录或子文件（File对象）
                // F:\Software\IDEA\Projects\test\easyftp-server-1.7.0.10-cn
                File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());
                if(zipEntry.isDirectory()){
                    // 物理磁盘创建子目录
                    file.mkdirs();
                }else{
                    // 物理磁盘创建子文件
                    file.createNewFile();

                    // 读取当前压缩包中的子文件，并通过输出流out写入新子文件中
                    try(FileOutputStream out = new FileOutputStream(file)) {
                        byte[] buff = new byte[1024];
                        int len = -1;
                        while((len = in.read(buff)) != -1){
                            out.write(buff,0,len);
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //解压完成，删除压缩包
        if (sourceFile.delete()) {
            log.info(path + "文件删除成功");
        } else {
            log.info(path + "文件删除失败");
        }

    }

}
